import pandas as pd
import requests
from bs4 import BeautifulSoup


def simple_request_check(url, headers):
    """使用 requests 库发送简单的 HTTP 请求，判断是否能访问，并尝试获取标题或内容类型"""
    try:
        response = requests.get(url, timeout=5, headers=headers)  # 设置 5 秒超时并加入 headers

        # 如果状态码是 200，说明链接可以访问
        if response.status_code == 200:
            content_type = response.headers.get('Content-Type', '').lower()

            # 如果是 HTML，尝试提取标题
            if 'text/html' in content_type:
                try:
                    # 设置正确的编码
                    response.encoding = response.apparent_encoding
                    # 使用 BeautifulSoup 获取网页标题
                    soup = BeautifulSoup(response.content, 'html.parser')
                    title = soup.title.string if soup.title else "无标题"
                    return True, title, ''
                except:
                    return True, '', ''
            # 如果不是 HTML，返回对应的内容类型提示
            else:
                print(f"链接 {url} 返回非HTML内容: {content_type}")
                return True, f"非HTML内容: {content_type}", ''

        else:
            # 状态码不是 200，返回不可访问
            print(f"链接 {url} 返回状态码: {response.status_code}")
            return False, None, f'状态码不是 200，是{response.status_code}'

    except requests.RequestException as e:
        # 处理请求异常
        print(f"请求 {url} 时出错: {e}")
        return False, None, str(e)

    except Exception as e:
        # 处理其他异常
        print(f"解析 {url} 时发生未知错误: {e}")
        return False, "解析错误", str(e)


# 读取 Excel 文件，检查 '是否能访问' 列为 False 的行，并重新检查链接是否可以访问
def update_excel(input_file, output_file):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
        'Referer': 'https://www.baidu.com/'
    }

    # 读取 Excel 文件
    df = pd.read_excel(input_file)
    print(df)

    # 遍历 '是否能访问' 为 False 的行
    print(df.columns)
    df_filter = df[df['是否能访问'].apply(lambda item: str(item).lower() == 'false')]
    print(len(df_filter))
    for index, row in df_filter.iterrows():
        url = row['链接']
        accessible, title, reason = simple_request_check(url, headers)

        # 更新 '是否能访问' 和 '标题' 列
        df.at[index, '是否能访问'] = 'TRUE' if accessible else 'FALSE'
        df.at[index, '标题'] = title if title else "无法访问"
        df.at[index, '原因'] = reason

    # 保存更新后的文件
    df.to_excel(output_file, index=False)
    print(f"更新后的 Excel 已保存到 {output_file}")


# 使用示例
input_file = 'crawl_results_1983.xlsx'  # 输入 Excel 文件路径
output_file = 'crawl_results_1983_change.xlsx'  # 输出更新后的 Excel 文件路径

update_excel(input_file, output_file)
